<?php
namespace app\controller;

use app\BaseController;
use think\App;
use think\facade\Cache;
use think\cache\driver\Redis;
use think\facade\Db;
use think\Request;


class Index extends BaseController
{
    private $redis;
    public function __construct(App $app)
    {
        $this->redis = new Redis();
        parent::__construct($app);
    }
    public function testIndex()
    {// typeerror
        set_time_limit(6000);
       $end = 100000;
       $arr = [];
       for ($i=101;$i<$end;$i++) {
           $arr[$i]['a'] = $i+1;
           $arr[$i]['b'] = $i+1;
           $arr[$i]['c'] = $i+1;
           $arr[$i]['d'] = $i+1;
       }
        #Db::name('testindex')->insertAll($arr);
    }

    public function index()
    {
        return '<style type="text/css">*{ padding: 0; margin: 0; } div{ padding: 4px 48px;} a{color:#2E5CD5;cursor: pointer;text-decoration: none} a:hover{text-decoration:underline; } body{ background: #fff; font-family: "Century Gothic","Microsoft yahei"; color: #333;font-size:18px;} h1{ font-size: 100px; font-weight: normal; margin-bottom: 12px; } p{ line-height: 1.6em; font-size: 42px }</style><div style="padding: 24px 48px;"> <h1>:) 2020新春快乐</h1><p> ThinkPHP V' . \think\facade\App::version() . '<br/><span style="font-size:30px;">14载初心不改 - 你值得信赖的PHP框架</span></p><span style="font-size:25px;">[ V6.0 版本由 <a href="https://www.yisu.com/" target="yisu">亿速云</a> 独家赞助发布 ]</span></div><script type="text/javascript" src="https://tajs.qq.com/stats?sId=64890268" charset="UTF-8"></script><script type="text/javascript" src="https://e.topthink.com/Public/static/client.js"></script><think id="ee9b1aa918103c4fc"></think>';
    }

    public function hello2()
    {// typeerror
      echo $this->hello1([1]);
    }
    public function hello1(Request $request)
    {
        echo 111;
        return $request->hello; // ThinkPHP
    }

    /**
     * @param string $name
     * @return string
     */
    public function testRedis()
    {
        // $redis = new Redis();
        // Cache::store('redis')->set('name','我爱你中国',3600);
        Cache::store('redis')->set('rds','我爱你中国AAA');
        Cache::store('redis')->set('rds1','我AAA');
        Cache::store('redis')->set('rds2','我');
        $k4 = Cache::store('redis')->set('rd4', time(), array('nx', 'ex' => 3600));
        $ok = Cache::store('redis')->setnx('rds3','我setnx');
        Cache::store('redis')->expire('rds3',36);
        $na = Cache::store('redis')->get('rds');

        return 'hello,'.$na .'   **'.$ok."*******".$k4;
    }
    public function list()
    {
        //存储数据到列表中
        $this->redis->lpush("tutorial-list", "Redis");
        $this->redis->lpush("tutorial-list", "Mongodb");
        $this->redis->lpush("tutorial-list", "Mysql");
        // 获取存储的数据并输出
        $arList = $this->redis->lrange("tutorial-list", 0 ,5);
        echo "Stored string in redis";
        print_r($arList);
    }

    /**
     * 10万用户一年365天的登录情况如何用redis存储，并快速检索任意时间窗内的活跃用户
    使用redsi的bitmap数据结构
    setbit getbit 两条命令是对字符串的位操作。每个位只能是0/1，然后用Bitcount命令计算这个key有多少个1
    举个例子，如果今天是网站上线的第 100 天，而用户 peter 在今天阅览过网站，那么执行命令 SETBIT peter 100 1 ；如果明天 peter 也继续阅览网站，那么执行命令 SETBIT peter 101 1 ，以此类推。
    当要计算 peter 总共以来的上线次数时，就使用 BITCOUNT 命令：执行 BITCOUNT peter ，得出的结果就是 peter 上线的总天数
    用BITOP命令来对多天的key 做一个“或”运算，就知道某个时间段内活跃的人数
    bitpos命令：
    语法：bittops key bit [start] [end]
    返回位图中第一个值为bit的二进制位的位置
     */
    public function alize()
    {
        //存储数据到列表中
        #$this->redis->set('pig', '*'); // this is 0111 1111

        $this->redis->setBit("pig",112,1);

        // 获取存储的数据并输出
        $arList = $this->redis->bitCount("pig");
        echo "Stored string in redis  ".$arList;

    }
    public function rset()
    {
        //存储数据到列表中
        $this->redis->sadd("reset", "Redis");
        $this->redis->sadd("reset", "Mongodb");
        $this->redis->sadd("reset", "Mysql");
        // 获取存储的数据并输出
        $arList = $this->redis->smembers("reset");
        echo "Stored string in redis";
        print_r($arList);
    }
    ///秒杀入口
    public function insva(){
        $id = input('id');//获取商品id
        if(!$id){
            return $this->insertlog(0);//记录失败日志
        }
        $redis = $this->redis();//接入redis
        $count = $redis->reduceStock('goods_stock');//减少库存，返回剩余库存
        if($count ==0){
            $this->insertlog(0);//记录秒杀失败日志
            return false;
        }else{
            $order = $this->build_order_no();//随机生成订单号
            $status = 1;
            $data = Db::table('goods')->where('id',$id)->find();
            if (!$data){
                return $this->insertlog(0);//商品不存在
            }
            $res = db('order')->insert(['order_sn'=>$order,'uid'=>$this->user_id,'goods_id'=>$id]);//插入订单
            $stock = db('goods')->where('id',$id)->dec("count")->update(); //库存减少
            if($stock){
                $this->insertlog();//记录成功日志
            }else{
                $this->insertlog(0);//记录秒杀失败日志
            }
        }
    }

    // 将商品库存存入队列
    public function redisinit(){
        $store=50; // 库存50
        $redis=$this->redis(); //接入redis
        $redis->del('goods_store'); // 删除库存列表
        $res=$redis->llen('goods_store'); //返回库存长度，这里已经是0
        $count=$store-$res;
        for($i=0;$i<$count;$i++){
            $redis->lpush('goods_store',1); //列表推进50个，模拟50个商品库存
        }
    }

    //生成唯一订单
    function build_order_no(){
        return date('ymd').substr(implode(NULL, array_map('ord', str_split(substr(uniqid(), 7, 13), 1))), 0, 8);
    }

    // 记录日志 状态1成功 0失败
    function insertlog($status=1){
        return Db::name("ab_log")->insertGetId(["count"=>1,"status"=>$status,"addtime"=>date('Y-m-d H:i:s')]);
    }
}
